/*
 * Powered By XY
 * Since 2020
 */

package com.xy.biz.uc.service;

import com.xy.biz.uc.domain.req.*;
import com.xy.biz.uc.domain.vo.GroupRoleUserTree;
import com.xy.biz.uc.domain.bo.UserBO;
import com.xy.biz.uc.domain.query.UserCodeQuery;
import com.xy.biz.uc.domain.query.UserIdQuery;
import com.xy.biz.uc.domain.query.UserQuery;
import com.xy.lang.domain.Result;

import java.util.Collection;
import java.util.List;

/**
 *
 *
 * @author zsp
 * @date 2020-8-19
 */
public interface UserService {

	/**
	 * 保存
	 *
	 * @param userBO
	 */
	Result<?> saveUserByUserCode(UserBO userBO);

	/**
	 * 保存
	 *
	 * @param userBO
	 */
	Result<?> saveUserByMobile(UserBO userBO);

	/**
	 * 保存
	 *
	 * @param userBO
	 */
	Result<?> saveUserByEmail(UserBO userBO);

	/**
	 * 更新
	 *
	 * @param userBO
	 */
	Result<?> updateUser(UserBO userBO);

	/**
	 * 禁闭/解禁用户
	 *
	 * @param userBO
	 */
	Result<?> lockUser(UserBO userBO);

	/**
	 * 更新用户基本信息
	 *
	 * @param userBO
	 */
	Result<?> updateUserBaseInfo(UserBO userBO);

	/**
	 * 删除
	 *
	 * @param userId
	 */
	Result<?> deleteUser(Long userId);

	/**
	 * 查找一个
	 *
	 * @param userIdQuery
	 * @return
	 */
	UserBO getUser(UserIdQuery userIdQuery);

	/**
	 * 是否包含权限
	 */
	boolean hasPermission();

	/**
	 * 判断当前用户是否具有指定的角色
	 *
	 * @param includeRoleCode				包括的角色编号
	 * @param excludeRoleCodeCollection		不包括的角色编号
	 * @param mandatory						true表示只能具有指定的角色；false表示除指定角色之外，也可以具有其它的角色。
	 * @return								返回true表示具有，否则返回false表示不具有。
	 */
	boolean isInRole(String includeRoleCode, Collection<String> excludeRoleCodeCollection, boolean mandatory);

	/**
	 * 判断当前用户是否具有指定的角色
	 * @param includeRoleCodeCollection		包括的角色编号
	 * @param excludeRoleCodeCollection		不包括的角色编号
	 * @param mandatory						true表示要具有指定的全部角色；false表示只要具有指定的角色之一即可。
	 * @return								返回true表示具有，否则返回false表示不具有。
	 */
	boolean isInRole(Collection<String> includeRoleCodeCollection, Collection<String> excludeRoleCodeCollection, boolean mandatory);

	/**
	 * 根据用户名查找一个
	 *
	 * @param query
	 * @return
	 */
	UserBO getUserByUserName(UserQuery query);

	List<UserBO> getUserByUserNameS(Collection<String> collection);


	/**
	 * 查找多个
	 *
	 * @param ids 查找条件
	 */
	List<UserBO> listUserByUserGroup(Collection<Long> ids);
	/**
	 * 获取头像接口
	 *
	 * @return
	 */
	Result<?> getUserAvatar();

	/**
	 * 查找一个
	 *
	 * @param userCodeQuery
	 * @return
	 */
	UserBO getUserByUserCode(UserCodeQuery userCodeQuery);

	/**
	 * 查找多个
	 *
	 * @param userIdQuery
	 */
	List<UserBO> listUserById(UserIdQuery userIdQuery);

	/**
	 * 查找多个
	 *
	 * @param query 查找条件
	 */
	List<UserBO> listUser(UserQuery query);

	/**
	 * 统计个数
	 *
	 * @param query 查找条件
	 */
	int countUser(UserQuery query);

	/**
	 * 查找多个
	 *
	 * @param collection
	 */
	List<UserBO> listUserByRoleId(Collection<Long> collection);

	/**
	 *
	 * @param userId
	 * @return
	 */
	List<Long> listRoleIdByUserId(Long userId);

	/**
	 *
	 * @param userGroupId
	 * @param userId
	 * @return
	 */
	Result<?> saveOrUpdateUserGroupUser(Long userGroupId, Long userId);

	/**
	 *
	 * @param userId
	 * @return
	 */
	Result<?> deleteUserGroupUser(Long userId);

	/**
	 *
	 * @param userId
	 * @return
	 */
	Long getUserGroupId(Long userId);

	/**
	 * 设置头像
	 * @return
	 */
	Result<?> setUserAvatar(String avatar);

    /**
     * 生成根据部门角色选人插件数据
     * @return
     */
    GroupRoleUserTree listUsers(ListUserRequest request);

	/**
	 * 根据用户名模糊搜索用户
	 * @param userQuery
	 * @return
	 */
	List<UserBO> searchUser(UserQuery userQuery);

	/**
	 * 区分条件根据用户名模糊搜索用户
	 * @param request
	 * @return
	 */
	List<UserBO> searchUserByKeyword(SearchUserRequest request);

	/**
	 * 根据角色Code模糊搜索用户
	 * @param request
	 * @return
	 */
	List<UserBO> searchUserByCode(SearchUserByCodeRequest request);

    int searchCountUser(UserQuery userQuery);

	Result<?> getAllNoGroupUser();

	Result<?> getUsersByGroupId(GetUserGroupRequest request);

	Result<?> removeUserGroupUserRel(RemoveUserGroupUserRelRequest request);

	Collection<Long> listUserIdByUserGroupId(Collection<Long> collection);
}
